﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using Licitar.Models;
using System.Web.Profile;

namespace Licitar.Controllers
{
    public class UsuarioController : Controller
    {
        LicitarDB _db = new LicitarDB();

        public JsonResult BuscarEmpresas(string term)
        {
            var result = _db.Empresas
                .Where(c => c.NombreEmpresa.StartsWith(term) || String.IsNullOrEmpty(term))
                .Take(7)
                .Select(c => new { label = c.NombreEmpresa, value = c.EmpresaID})
                .ToList();
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        //
        // GET: /Usuario/Ingrear

        public ActionResult Ingresar()
        {
            return View();
        }

        //
        // POST: /Usuario/Ingresar

        [HttpPost]
        public ActionResult Ingresar(IngresarModel modelo, string regresarUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(modelo.NombreUsuario, modelo.Password))
                {
                    FormsAuthentication.SetAuthCookie(modelo.NombreUsuario, modelo.Recordarme);
                    if (Url.IsLocalUrl(regresarUrl) && regresarUrl.Length > 1 && regresarUrl.StartsWith("/")
                        && !regresarUrl.StartsWith("//") && !regresarUrl.StartsWith("/\\"))
                    {
                        return Redirect(regresarUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "El usuario o contraseña ingresados son incorrectos");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(modelo);
        }

        //
        // GET: /Usuario/Salir

        public ActionResult Salir()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("Index", "Home");
        }

        //
        // GET: /Usuario/Registrar

        public ActionResult Registrar()
        {
            return View();
        }

        //
        // POST: /Usuario/Registrar

        [HttpPost]
        public ActionResult Registrar(RegistrarModelo modelo)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus;
                Membership.CreateUser(modelo.NombreUsuario, modelo.Password, modelo.Email, null, null, true, null, out createStatus);

                if (createStatus == MembershipCreateStatus.Success)
                {
                    ProfileBase perfil = ProfileBase.Create(modelo.NombreUsuario);

                    perfil["Nombre"] = modelo.NombreUsuario;
                    perfil["Apellido"] = modelo.Apellido;
                    perfil["DNI"] = modelo.DNI;

                    perfil.Save();

                    FormsAuthentication.SetAuthCookie(modelo.NombreUsuario, false /* createPersistentCookie */);
                    return RedirectToAction("UnirseEmpresa", "Usuario");
                }
                else
                {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            return View(modelo);
        }

        //
        // GET: /Usuario/UnirseEmpresa

        public ActionResult UnirseEmpresa()
        {
            return View();
        }

        //
        // POST: /Usuario/UnirseEmpresa

        [HttpPost]
        public ActionResult UnirseEmpresa(AgregarEmpresa modelo)
        {
            if (ModelState.IsValid)
            {
                ProfileBase perfil = ProfileBase.Create(System.Web.HttpContext.Current.User.Identity.Name);

               perfil["Empresa"] = modelo.Empresa;
               perfil.Save();

                return RedirectToAction("Index", "Home");
            }
            return View(modelo);
        }
        //
        // GET: /Usuario/CambiarPassword

        [Authorize]
        public ActionResult CambiarPassword()
        {
            return View();
        }

        //
        // POST: /Usuario/CambiarPassword

        [Authorize]
        [HttpPost]
        public ActionResult CambiarPassword(CambiarPasswordModel modelo)
        {
            if (ModelState.IsValid)
            {

                // ChangePassword will throw an exception rather
                // than return false in certain failure scenarios.
                bool changePasswordSucceeded;
                try
                {
                    MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
                    changePasswordSucceeded = currentUser.ChangePassword(modelo.ViejoPassword, modelo.NuevoPassword);
                }
                catch (Exception)
                {
                    changePasswordSucceeded = false;
                }

                if (changePasswordSucceeded)
                {
                    return RedirectToAction("CambiarPassowrdOK");
                }
                else
                {
                    ModelState.AddModelError("", "La contraseña ingresada es incorrecta o la nueva contraseña no es válida");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(modelo);
        }

        //
        // GET: /Usuario/CambiarPasswordOK

        public ActionResult CambiarPasswordOK()
        {
            return View();
        }

        #region Status Codes
        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // See http://go.microsoft.com/fwlink/?LinkID=177550 for
            // a full list of status codes.
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "El nombre de usuario elegido ya existe. Por favor ingrese un nuevo nombre.";

                case MembershipCreateStatus.DuplicateEmail:
                    return "Ya existe un usuario con la dirección de correo electrónico ingresada. Por favor ingrese una dirección diferente.";

                case MembershipCreateStatus.InvalidPassword:
                    return "La contraseña ingresada no es válida. Por favor reingrese su contraseña.";

                case MembershipCreateStatus.InvalidEmail:
                    return "La dirección de correo electrónico ingresada no es válida. Por favor ingrese una dirección diferente.";

                /*case MembershipCreateStatus.InvalidAnswer:
                    return "The password retrieval answer provided is invalid. Please check the value and try again.";

                case MembershipCreateStatus.InvalidQuestion:
                    return "The password retrieval question provided is invalid. Please check the value and try again.";*/

                case MembershipCreateStatus.InvalidUserName:
                    return "El nombre de usuario ingresado no es válido. Por favor ingrese un nuevo nombre.";

                case MembershipCreateStatus.ProviderError:
                    return "Hubo un error en el ingreso. Por favor verifique sus datos y reingreselos. Si el problema persiste contacte al administrador del sistema.";

                case MembershipCreateStatus.UserRejected:
                    return "La creación del usuario ha sido cancelada. Por favor verifique sus datos y reingreselos. Si el problema persiste contacte al administrador del sistema.";

                default:
                    return "Ha ocurrido un error desconocido. Por favor verifique sus datos y reingreselos. Si el problema persiste contacte al administrador del sistema.";
            }
        }
        #endregion
    }
}
